package model

// 定义链表节点结构体
type listNode[T any] struct {
	Data T            // 节点存储的数据，这里使用interface{}以便存储任意类型
	Next *listNode[T] // 指向下一个节点的指针
}

func NewLinkedList[T any](size int) *LinkedList[T] {
	return &LinkedList[T]{capital: size}
}

// 定义链表结构体
type LinkedList[T any] struct {
	Head    *listNode[T] // 链表头节点
	capital int
	len     int
}

// 创建一个新的链表节点
func newNode[T any](data T) *listNode[T] {
	return &listNode[T]{Data: data, Next: nil}
}

// 向链表末尾添加新节点
func (x *LinkedList[T]) Push(data T) {
	newNode := newNode(data)

	if x.Head == nil {
		x.Head = newNode
	} else {
		curr := x.Head
		for curr.Next != nil {
			curr = curr.Next
		}
		curr.Next = newNode
		x.len++
		if x.len >= x.capital {
			x.Shift()
		}
	}
}

// 删除链表表头节点
func (x *LinkedList[T]) Shift() (*T, bool) {
	if x.Head == nil {
		return nil, false
	}

	head := x.Head
	data := head.Data
	x.Head = head.Next
	return &data, true
}
